self taught software engineer